#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>

// 理解Linux系统中的标志位flags
#define ONE 1
#define TWO 2
#define THREE 4

void Show(int flags)
{
    if(flags&ONE)
    {
        fprintf(stdout,"ONE\n");
    }

    if(flags&TWO)
    {
        fprintf(stdout,"TWO\n");
    }

    if(flags&THREE)
    {
        fprintf(stdout,"THREE\n");
    }

}


// 验证文件描述符的分配规则---优先最小，而且没有被占用的file*_array数组下标
int main()
{ 

    Show(ONE|TWO);

    // C语言    Linux系统
    // stdin -> 0
    // stdout -> 1
    // stderr -> 2
    // FILE*->_fileno -> fd
    //close(0);
    //close(1);
    //close(2);

    //int fd=open("log.txt",O_WRONLY|O_TRUNC|O_CREAT,0666);
//    int fd=open("log.txt",O_WRONLY|O_APPEND|O_CREAT,0666);
//    if(fd<0)
//    {
//        perror("open");
//        exit(1);
//    }
//
    const char* ps="abcdef\n";

    // 文件描述符1默认对应的是显示器，但在open之前将文件描述符 1 对应的文件关闭，
    // 之后再open根据文件描述符的分配规则文件log.txt对应的文件描述符就成了1
    // 所以明明是往显示器写入的数据改为往log.txt文件中写入
    write(1,ps,strlen(ps)); 


    //fprintf(stdout,"fd:%d\n",fd);
    //write(fd,ps,strlen(ps));

//    int fd1=open("log1.txt",O_WRONLY|O_TRUNC|O_CREAT,0666);
//    int fd2=open("log2.txt",O_WRONLY|O_TRUNC|O_CREAT,0666);
//    int fd3=open("log3.txt",O_WRONLY|O_TRUNC|O_CREAT,0666);
//
//    printf("fd1:%d\n",fd1);
//    printf("fd2:%d\n",fd2);
//    printf("fd3:%d\n",fd3);
//
//    close(fd1);
//
//    int fd4=open("log4.txt",O_WRONLY|O_TRUNC|O_CREAT,0666);
//    printf("fd4:%d\n",fd4);
//
    return 0;
}
